<div>
  Definisce un'espressione logica che determina quali agenti possano eseguire le
  compilazioni di questo progetto. Quest'espression, se testata con il nome e le
  etichette di ogni agente disponibile, sarà valutata come
  <i>true</i>
  o
  <i>false</i>
  . Se l'espressione viene valutata come
  <i>true</i>
  , allora a tale agente sarà consentito eseguire le compilazioni di questo
  progetto.
  <p>
    Se questo progetto dovrebbe essere sempre compilato su un agente specifico,
    o sul nodo master Jenkins, allora si dovrebbe immettere semplicemente,
    rispettivamente, il nome dell'agente o
    <code>master</code>
    .
  </p>

  <p>
    Ciò nonostante, si dovrebbe generalmente evitare di usare il
    <i>nome</i>
    di un agente in questo campo, preferendo le
    <i>etichette</i>
    di un agente. Come documentato sulla pagina di configurazione di ogni agente
    e sulla pagina
    <i>Configura sistema</i>
    del nodo master, è possibile utilizzare etichette per rappresentare il
    sistema operativo su cui è in esecuzione l'agente, la sua architettura CPU o
    un qualunque numero di altre caratteristiche.
    <br />
    L'utilizzo delle etichette fa venir meno la necessità di riconfigurare
    l'espressione etichetta immessa in questo campo ogni volta che si
    aggiungono, rimuovono o ridenominano agenti.
  </p>

  <p>
    Un'espressione etichetta può essere semplicemente una singola
    <b>etichetta</b>
    o
    <b>nome agente</b>
    , ad esempio
    <code>android-builder</code>
    o
    <code>linux-machine-42</code>
    .
    <br />
    È possibile inoltre utilizzare svariati
    <i>operatori</i>
    per creare espressioni più complesse.
  </p>

  <h3>Operatori supportati</h3>
  Sono supportati i seguenti operatori in ordine di precedenza decrescente:
  <dl>
    <dt><code>(espressione)</code></dt>
    <dd>
      parentesi — utilizzate per definire esplicitamente l'associatività di
      un'espressione
    </dd>

    <dt><code>!espressione</code></dt>
    <dd>
      NOT — negazione; il risultato di
      <code>espressione</code>
      <b>non</b>
      dev'essere vero
    </dd>

    <dt><code>a &amp;&amp; b</code></dt>
    <dd>
      AND —
      <b>entrambe</b>
      le espressioni
      <code>a</code>
      e
      <code>b</code>
      devono essere vere
    </dd>

    <dt><code>a || b</code></dt>
    <dd>
      OR —
      <b>una</b>
      delle espressioni
      <code>a</code>
      o
      <code>b</code>
      può essere vera
    </dd>

    <dt><code>a -> b</code></dt>
    <dd>
      operatore "implica" — equivalente ad
      <code>!a || b</code>
      .
      <br />
      Ad esempio,
      <code>windows -> x64</code>
      può essere interpretato come "se viene utilizzato un agente Windows,
      allora tale agente
      <i>deve</i>
      essere a 64 bit", consentendo comunque l'esecuzione su qualunque agente
      che
      <i>non</i>
      abbia l'etichetta
      <code>windows</code>
      , a prescindere dal fatto che abbia l'etichetta
      <code>x64</code>
    </dd>

    <dt><code>a &lt;-> b</code></dt>
    <dd>
      operatore "se e solo se" — equivalente a
      <code>a &amp;&amp; b || !a &amp;&amp; !b</code>
      <br />
      Ad esempio,
      <code>windows &lt;-> dc2</code>
      può essere interpretato come "se viene utilizzato un agente Windows,
      allora tale agente
      <i>deve</i>
      essere nel datacenter 2, ma se viene utilizzato un agente non Windows,
      allora
      <i>non deve</i>
      essere nel datacenter 2"
    </dd>
  </dl>

  <h3>Note</h3>
  <ul>
    <li>
      Tutti gli operatori sono associativi a sinistra, ossia
      <code>a -> b -> c</code>
      è equivalente ad
      <code>(a -> b) -> c</code>
      .
    </li>
    <li>
      Le etichette o i nomi degli agenti possono essere racchiusi da virgolette
      doppie se contengono caratteri che andrebbero in conflitto con la sintassi
      degli operatori.
      <br />
      Ad esempio,
      <code>"osx (10.11)" || "Windows Server"</code>
      .
    </li>
    <li>
      Le espressioni possono essere scritte senza spazi bianchi, ma includerli è
      raccomandato per questioni di leggibilità; Jenkins ignorerà gli spazi
      bianchi durante la valutazione delle espressioni.
    </li>
    <li>
      La ricerca di corrispondenze fra etichette o nomi agenti con espressioni
      con caratteri jolly o espressioni regolari non è supportata.
    </li>
    <li>
      Un'espressione vuota verrà sempre valutata come
      <i>true</i>
      e corrisponderà a tutti gli agenti.
    </li>
  </ul>

  <h3>Esempi</h3>
  <dl>
    <dt><code>built-in</code></dt>
    <dd>
      Le compilazioni di questo progetto possono eseguite solo sul nodo master
      di Jenkins
    </dd>

    <dt><code>linux-machine-42</code></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo
      sull'agente denominato
      <code>linux-machine-42</code>
      (o su qualunque sistema che abbia un'etichetta denominata
      <code>linux-machine-42</code>
      )
    </dd>

    <dt><code>windows &amp;&amp; jdk9</code></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo su un
      qualunque agente Windows che abbia installata la versione 9 del Java
      Development Kit (assumendo che agli agenti su cui sia installato JDK 9 sia
      stata assegnata l'etichetta
      <code>jdk9</code>
      )
    </dd>

    <dt><code>postgres &amp;&amp; !vm &amp;&amp; (linux || freebsd)</code></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo su
      qualunque agente Linux o FreeBSD fintantoché
      <i>non</i>
      siano una macchina virtuale e abbiano PostgreSQL installato (assumendo che
      ogni agente abbia le etichette appropriate — in particolare, ogni agente
      in esecuzione in una macchina virtuale deve avere l'etichetta
      <code>vm</code>
      affinché quest'esempio funzioni come atteso)
    </dd>
  </dl>
</div>
